// funtemp.cpp - using a function template
//#include <iostream>
//
//// function template prototype
//template <typename T>	// or class T
//void Swap(T& a, T& b);
//
//int main()
//{
//	using namespace std;
//
//	int i = 10;
//	int j = 20;
//	cout << "i, j = " << i << ", " << j << ".\n";
//	cout << "Using compiler-generated int swapper:\n";
//	Swap(i, j);	// generates void Swap(int&, int&)
//	cout << "Now i, j = " << i << ", " << j << ".\n";
//
//	double x = 24.5;
//	double y = 81.7;
//	cout << "x, y = " << x << ", " << y << ".\n";
//	cout << "Using compiler-generated double swapper:\n";
//	Swap(x, y);	// generates void Swap(double&, double&)
//	cout << "Now x, y = " << x << ", " << y << ".\n";
//	// cin.get();
//	return 0;
//}
//
//// function template defination
//template<typename T>	// or class T
//void Swap(T& a, T& b)
//{
//	T temp;	// temp a variable of type T
//	temp = a;
//	a = b;
//	b = temp;
//}

// twoswap.cpp -- specialization overrides a tempate
//#include <iostream>
//
//template <typename T>
//void Swap(T& a, T& b);
//
//struct job
//{
//	char name[40];
//	double salary;
//	int floor;
//};
//
//// explicit specialization
//template <> void Swap<job>(job& j1, job& j2);
//void Show(job& j);
//
//int main()
//{
//	using namespace std;
//	cout.precision(2);
//	cout.setf(ios::fixed, ios::floatfield);
//	int i = 10, j = 20;
//	cout << "i, j = " << i << ", " << j << ".\n";
//	cout << "Using compiler-generated int swapper:\n";
//	Swap(i, j);		// generates void Swap(int&, int&)
//	cout << "Now i, j = " << i << ", " << j << ".\n";
//
//	job sue = { "Susan Yaffee", 73000.60, 7 };
//	job sidney = { "Sidney Taffee", 78060.72, 9 };
//	cout << "Before job swapping:\n";
//	Show(sue);
//	Show(sidney);
//	Swap(sue, sidney);	// uses void Swap(job&, job&)
//	cout << "After job swapping:\n";
//	Show(sue);
//	Show(sidney);
//	
//	return 0;
//}
//
//template <typename T>
//void Swap(T& a, T& b)	// general version
//{
//	T temp;
//	temp = a;
//	a = b;
//	b = temp;
//}
//
//// swaps just the salary and floor fields of a job structure
//template<> void Swap<job>(job& j1, job& j2)		// specialization
//{
//	double t1;
//	int t2;
//	t1 = j1.salary;
//	j1.salary = j2.salary;
//	j2.salary = t1;
//	t2 = j1.floor;
//	j1.floor = j2.floor;
//	j2.floor = t2;
//}
//
//void Show(job& j)
//{
//	using namespace std;
//	cout << j.name << ": $" << j.salary
//		<< " on floor " << j.floor << endl;
//}

// tempover.cpp -- template overloading
//#include <iostream>
//
//template <typename T>		// template A
//void ShowArray(T arr[], int n);
//
//template <typename T>		// template B
//void ShowArray(T* arr[], int n);
//
//struct debts
//{
//	char name[50];
//	double amount;
//};
//
//int main()
//{
//	using namespace std;
//	int things[6] = { 13,31,103,301,310,130 };
//	struct debts mr_E[3]
//	{
//		{"Ima Wolfe", 2400.0},
//		{"Ura Foxe", 1300.0},
//		{"Iby Stout", 1800.0}
//	};
//	double* pd[3];
//
//	// set pointers to the amount members of the structures in mr_E
//	for (int i = 0; i < 3; i++)
//	{
//		pd[i] = &mr_E[i].amount;
//	}
//
//	cout << "Listing Mr.E's counts of things:\n";
//	// things is an array of int
//	ShowArray(things, 6);	// uses template A
//	cout << "Listing Mr.E's debts:\n";
//	// pd is an array of pointers to double
//	ShowArray(pd, 3);		// uses template B (more sepecialized)
//
//	return 0;
//}
//
//template <typename T> void ShowArray(T arr[], int n)
//{
//	using namespace std;
//	cout << "template A\n";
//	for (int i = 0; i < n; i++)
//	{
//		cout << arr[i] << ' ';
//	}
//	cout << endl;
//}
//
//template<typename T> void ShowArray(T* arr[], int n)
//{
//	using namespace std;
//	cout << "template B\n";
//	for (int i = 0; i < n; i++)
//	{
//		cout << *arr[i] << ' ';
//	}
//	cout << endl;
//}

// external.cpp -- external variables
// compile with support.cpp
//#include <iostream>
//using namespace std;
//// external variable
//double warming = 0.3;	// warming defined
//// function prototypes
//void update(double dt);
//void local();
//
//int main()			// use global variable
//{
//	cout << "Global warming is " << warming << " degrees.\n";
//	update(0.1);	// call function to change warming
//	cout << "Global warming is " << warming << " degress.\n";
//	local();		// call function with local warming
//	cout << "Global warming is " << warming << " degrees.\n";
//
//	return 0;
//}

// towwfile1.cpp -- variables with external and internal linkage
//#include <iostream>		// to be compiled with two file2.cpp
//int tom = 3;			// external variable definition
//int dick = 30;			// external variable definition
//static int harry = 300;	// static, internal linkage
//
//// function prototype
//void remote_access();
//
//int main()
//{
//	using namespace std;
//	cout << "main() reports the following addresses:\n";
//	cout << &tom << " = &tom, " << &dick << " = &dick, ";
//	cout << &harry << " = &harry\n";
//	remote_access();
//
//	return 0;
//}

// newplace.cpp -- using placement new
//#include <iostream>
//#include <new>			// for placement new
//const int BUF = 512;
//const int N = 5;
//char buffer[BUF];		// chunk of memory
//int main()
//{
//	using namespace std;
//
//	double* pd1, * pd2;
//	int i;
//	cout << "Calling new and placement new:\n";
//	pd1 = new double[N];			// use heap
//	pd2 = new (buffer) double[N];	// use buffer array
//	for (i = 0; i < N; i++)
//	{
//		pd2[i] = pd1[i] = 1000 + 20.0 * i;
//	}
//	cout << "Memory addresses:\n" << " heap: " << pd1
//		<< " static: " << (void*)buffer << endl;
//	cout << "Memory contents:\n";
//	for (i = 0; i < N; i++)
//	{
//		cout << pd1[i] << " at " << &pd1[i] << "; ";
//		cout << pd2[i] << " at " << &pd2[i] << endl;
//	}
//
//	cout << "\nCalling new and placement new a second time:\n";
//	double* pd3, * pd4;
//	pd3 = new double[N];			// find new address
//	pd4 = new (buffer) double[N];	// overwrite old data
//	for (i = 0; i < N; i++)
//	{
//		pd4[i] = pd3[i] = 1000 + 40.0 * i;
//	}
//	cout << "Memory contents:\n";
//	for (i = 0; i < N; i++)
//	{
//		cout << pd3[i] << " at " << &pd3[i] << "; ";
//		cout << pd4[i] << " at " << &pd4[i] << endl;
//	}
//
//	cout << "\nCalling new and placement new a third time:\n";
//	delete[] pd1;
//	pd1 = new double[N];
//	pd2 = new (buffer + N * sizeof(double)) double[N];
//	for (i = 0; i < N; i++)
//	{
//		pd2[i] = pd1[i] = 1000 + 60.0 * i;
//	}
//	cout << "Memory contents:\n";
//	for (i = 0; i < N; i++)
//	{
//		cout << pd1[i] << " at " << &pd1[i] << "; ";
//		cout << pd2[i] << " at " << &pd2[i] << endl;
//	}
//	delete[] pd1;
//	delete[] pd3;
//
//	return 0;
//}

// namesp.cpp -- namespaces
//#include <iostream>
//#include "test_240216.h"
//
//namespace pers
//{
//	using std::cout;
//	using std::cin;
//	void getPerson(Person& rp)
//	{
//		cout << "Enter first name: ";
//		cin >> rp.fname;
//		cout << "Enter last name: ";
//		cin >> rp.lname;
//	}
//	void showPerson(const Person& rp)
//	{
//		std::cout << rp.lname << ", " << rp.fname;
//	}
//}
//
//namespace debts
//{
//	void getDebt(Debt& rd)
//	{
//		getPerson(rd.name);
//		std::cout << "Enter debt: ";
//		std::cin >> rd.amount;
//	}
//	void showDebt(const Debt& rd)
//	{
//		showPerson(rd.name);
//		std::cout << ": $" << rd.amount << std::endl;
//	}
//	double sumDebts(const Debt ar[], int n)
//	{
//		double total = 0;
//		for (int i = 0; i < n; i++)
//		{
//			total += ar[i].amount;
//		}
//		return total;
//	}
//}